"""
数据类型工具模块
================

该模块提供统一的数据类型处理功能，确保在整个readwrite模块中数据类型处理的一致性。
"""

from typing import Union, Optional
from .typedef import DataType


def normalize_data_type(data_type: Optional[Union[str, DataType]]) -> Optional[str]:
    """
    标准化数据类型表示
    
    将数据类型统一转换为符合OPC UA标准的字符串格式
    
    Args:
        data_type: 输入的数据类型，可以是字符串或DataType枚举
        
    Returns:
        标准化的数据类型字符串，如果输入为None则返回None
    """
    if data_type is None:
        return None
    
    # 如果是DataType枚举，获取其值
    if isinstance(data_type, DataType):
        return data_type.value
    
    # 如果是字符串，进行标准化处理
    if isinstance(data_type, str):
        # 转换为正确的大小写形式以匹配OPC UA标准
        type_lower = data_type.lower()
        
        # 定义类型映射表
        type_mapping = {
            "string": "String",
            "int16": "Int16",
            "int32": "Int32",
            "int64": "Int64",
            "uint16": "UInt16",
            "uint32": "UInt32",
            "uint64": "UInt64",
            "float": "Float",
            "double": "Double",
            "boolean": "Boolean",
            "datetime": "DateTime",
            "bytestring": "ByteString",
            "xmlelement": "XmlElement",
            "nodeid": "NodeId",
            "expandednodeid": "ExpandedNodeId",
            "statuscode": "StatusCode",
            "qualifiedname": "QualifiedName",
            "localizedtext": "LocalizedText",
            "extensionobject": "ExtensionObject",
            "datavalue": "DataValue",
            "variant": "Variant",
            "diagnosticinfo": "DiagnosticInfo",
            "null": "Null",
            "sbyte": "SByte",
            "byte": "Byte",
            "guid": "Guid"
        }
        
        # 查找映射或使用默认转换（首字母大写）
        return type_mapping.get(type_lower, data_type.capitalize())
    
    # 其他情况，返回原值的字符串表示
    return str(data_type)